package com.luoshizhen.lease.web.app.controller.appointment;


import com.luoshizhen.lease.common.login.LoginUserHolder;
import com.luoshizhen.lease.common.result.Result;
import com.luoshizhen.lease.model.entity.ViewAppointment;
import com.luoshizhen.lease.web.app.service.ViewAppointmentService;
import com.luoshizhen.lease.web.app.vo.appointment.AppointmentDetailVo;
import com.luoshizhen.lease.web.app.vo.appointment.AppointmentItemVo;
import com.luoshizhen.lease.web.app.vo.appointment.AppointmentDetailVo;
import com.luoshizhen.lease.web.app.vo.appointment.AppointmentItemVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Tag(name = "看房预约信息")
@RestController
@RequestMapping("/app/appointment")
public class ViewAppointmentController {

    @Autowired
    private ViewAppointmentService service;

    /**
     * 保存或更新看房预约信息
     *
     * 当看房预约信息已存在时进行更新，不存在时进行保存
     * 此方法首先获取当前登录用户的ID，并将其设置到看房预约对象中，
     * 然后调用服务层方法进行保存或更新操作
     *
     * @param viewAppointment 看房预约对象，包含预约的详细信息
     * @return 返回操作结果，成功则返回Result.ok()
     */
    @Operation(summary = "保存或更新看房预约")
    @PostMapping("/saveOrUpdate")
    public Result saveOrUpdate(@RequestBody ViewAppointment viewAppointment) {

        // 设置当前登录用户的ID到看房预约对象
        viewAppointment.setUserId(LoginUserHolder.getLoginUser().getUserId());

        // 调用服务层方法保存或更新看房预约信息
        service.saveOrUpdate(viewAppointment);

        // 返回操作结果
        return Result.ok();
    }

    /**
     * 查询个人预约看房列表
     *
     * 该方法通过GET请求获取当前登录用户的所有预约看房项
     * 使用了Operation注解来描述接口的操作摘要，便于文档生成和维护
     *
     * @return 返回一个Result对象，其中包含用户预约看房的列表每个预约项都封装在AppointmentItemVo对象中
     */
    @GetMapping("listItem")
    public Result<List<AppointmentItemVo>> listItem() {
        // 调用服务层方法，根据当前登录用户的ID获取预约看房列表
        List<AppointmentItemVo> list = service.listItemByUserId(LoginUserHolder.getLoginUser().getUserId());
        // 返回成功结果，包含查询到的预约看房列表
        return Result.ok(list);
    }

    /**
     * 根据ID查询预约详情信息
     *
     * @param id 预约记录的唯一标识符
     * @return 返回包含预约详情信息的Result对象
     */
    @GetMapping("getDetailById")
    @Operation(summary = "根据ID查询预约详情信息")
    public Result<AppointmentDetailVo> getDetailById(Long id) {
        // 调用服务层方法获取预约详情信息
        AppointmentDetailVo appointmentDetailVo = service.getDetailById(id);
        // 返回成功的结果对象，包含预约详情信息
        return Result.ok(appointmentDetailVo);
    }

}

